/**
 * @brief �˵��ļ�(new)
 * @note MainMenuLength ������ѡ����ܸ���
 * MaxDisplayLine ������һҳ����ʾ�ĸ���
 * ���ļ���������ʾ�Ͱ���
 * �˵���Ҫִ�еĺ�������menuEXE.c��
 */
//#include "ABS_key.h"
//#include "C_code_Log.h"
#include "key.h"
#include "display.h"
//#include "globalTime.h"
#include "menu.h"
#include "gpio.h"
#include "myapp.h" // Include the header file where configureSetJiGuangX is declared
//#include "menuEXE.h"
//#include "stm32f1xx_hal.h""


/// @brief ʾ������
/// @return
My_StatusTypeDef noDo(int key_Num) {
  static int num = 4;
  displayNum(num, Display_firstCol, Display_firstRow);
  if (key_Num == Key_ESC) {
    return MY_READY;
  } else if (key_Num == Key_OK) {
    return MY_STANDBY;
  } else if (key_Num == Key_Down) {
    num--;
  } else if (key_Num == Key_UP) {
    num++;
  }

  return MY_BUSY;
}

/// @brief �˵��б�
menuList_t mainMenuList[] = {

    {"setJX", configureSetJiGuangX}, // Ensure configureSetJiGuangX is defined in menuEXE.h or elsewhere
    {"setJY", configureSetJiGuangY}, // Ensure configureSetJiGuangY is defined in menuEXE.h or elsewhere
    {"setSpeed", configureSetFindSpeed}, // Ensure configureSetFindSpeed is defined in menuEXE.h or elsewhere
    {"task2", task2},
    {"task3Shun", task3_Shun},
    {"task3Ni", task3_Ni},
    
};

#define MainMenuLength (sizeof(mainMenuList)/sizeof(menuList_t))  // ���Ĳ˵�����
#define MaxDisplayLine 4  // ÿҳ�����ʾ�Ĳ˵�����
#define MaxPages \
  ((MainMenuLength + MaxDisplayLine - 1) / MaxDisplayLine)  // ���ҳ��
#define LastPageLine                                        \
  ((MainMenuLength + MaxDisplayLine - 1) % MaxDisplayLine + \
   1)  // ���һҳ�Ĳ˵�����


/// @brief ��ʾ��� @note ����menuDisplay() ����
/// @param cursor ��������
///@author Sevenfite
static void displayCursor(int cursor) {
  static int temp = 1;
  if (cursor == temp) {
    displayStr("<", Display_lastCol, (cursor - 1) * Display_spaced, RED);
  } else {
    displayStr(" ", Display_lastCol, (temp - 1) * Display_spaced, RED);
    displayStr("<", Display_lastCol, (cursor - 1) * Display_spaced, RED);
    temp = cursor;
  }
}
/**
 *@brief �˵���ʾ
 *@note
 *���������¿��Կ��ƹ�꣬������ʾλ�õ�x������ͨ���궨��(Display_lastCol)��������
 *      ��OK������ִ�к���
 *      @arg MY_BUSY�ٴ�ִ�д˺�����
 *      @arg MY_OKΪ�˳�
 * @author Sevenfite
 * @note
 *����˵�������ʵ�ַ�ʽ��������ִ�а�����ɨ�裬����ֵ����Ŀ�꺯�����������д���,
 * @note �����в�������ɨ�裬���Ǳ�����ESCֵ���жϴ���������MY_OK/MY_READY
 * @note             ��OK֮��ѭ��ִ�к�����
 * @note �������ESC����ESC�����������������뷵��MY_OK�������˳�ѭ��
 * @note             �������OK����OK�����������ɺ������д���
 * @note             ����������¼��������¼������������ɺ������д���
 * @note ���ģ�2024/1/8 ��ִ�к���ʱ���������������������������ط�����ѯ
 */
void menuDisplay(void) {
  static int8_t keyNum = 0;     // 0��ʾû�а�������
  static int8_t cursor = 1;     // ��������(>=1)
  static int8_t pages = 1;      // ҳ��(>=1)
  static int8_t pagesTurn = 1;  // ҳ���Ƿ�ת,1��ʾ��ҳ
  static int8_t runFlag = 0;  // 0��ʾû�н��뺯����1��ʾ���뺯��������ִ�к���
  My_StatusTypeDef runState = MY_STANDBY;
  keyNum = key_scan_noDelay(1, HAL_GetTick());
  if (runFlag == 1) {
    // ʵ�ַ�ʽ��������ִ�а�����ɨ�裬����ֵ�����������������д�����
    // �����в�������ɨ�裬���Ǳ�����ESCֵ���жϴ���������MY_OK/MY_READY
    // ��OK֮��ѭ��ִ�к�����
    // �������ESC����ESC�����������������뷵��MY_OK�������˳�ѭ��
    // �������OK����OK�����������ɺ������д���
    // ����������¼��������¼������������ɺ������д���
    if (keyNum == 0) {
      mainMenuList[(cursor - 1 + (pages - 1) * MaxDisplayLine)].exe(0);
    } else if (keyNum == Key_ESC) {  // ��ESC�˳�
      runState = mainMenuList[(cursor - 1 + (pages - 1) * MaxDisplayLine)].exe(
          Key_ESC);
      if (runState == MY_OK) {  // �����������MY_OK�����������˳�
        displayClean();
        pagesTurn = 1;
        runState = MY_STANDBY;
        runFlag = 0;
      }
    } else if (keyNum == Key_OK) {
      mainMenuList[(cursor - 1 + (pages - 1) * MaxDisplayLine)].exe(Key_OK);
    } else if (keyNum == Key_Down) {
      mainMenuList[(cursor - 1 + (pages - 1) * MaxDisplayLine)].exe(Key_Down);
    } else if (keyNum == Key_UP) {
      mainMenuList[(cursor - 1 + (pages - 1) * MaxDisplayLine)].exe(Key_UP);
    }
  } else if (runFlag == 0) {
    switch (keyNum) {
      case Key_Down:
        cursor++;
        pagesTurn = 0;
        if (cursor > MaxDisplayLine) {
          pages++;
          pages = (pages - 1) % MaxPages + 1;
          cursor = 1;
          displayClean();
          pagesTurn = 1;
        }
        if (pages == MaxPages) {
          if (cursor > LastPageLine) {
            pages = 1;
            cursor = 1;
            displayClean();
            pagesTurn = 1;
          }
        }
        break;
        
      case Key_UP:
        cursor--;
        pagesTurn = 0;
        if (cursor < 1) {
          pages--;
          if (pages < 1) {
            pages = MaxPages;
            cursor = LastPageLine;
          } else {
            cursor = MaxDisplayLine;
          }
          displayClean();
          pagesTurn = 1;
        }
        break;

      case Key_OK:
        displayClean();
        runFlag = 1;
        return;
        break;

      default:
        break;
    }
    // ��ʾ����
    if (pagesTurn == 1) {
      if (pages == MaxPages) {
        for (int i = 0; i < LastPageLine; i++) {
          displayStr(mainMenuList[i + (pages - 1) * MaxDisplayLine].str,
                     Display_firstCol, i * Display_spaced, RED);
        }
      } else {
        for (int i = 0; i < MaxDisplayLine; i++) {
          displayStr(mainMenuList[i + (pages - 1) * MaxDisplayLine].str,
                     Display_firstCol, i * Display_spaced, RED);
        }
      }
      pagesTurn = 0;
    }
    displayCursor(cursor);  // ��ʾ���
  }
}
